// 引入其他的类
import Snake from "./Snake";
import Food from "./food";
import ScorePanel from "./ScorePanel";
// 游戏控制器，控制其他的所有类
class GameControl {
    // 定义三个属性
    // 蛇
    snake: Snake;
    // 食物
    food: Food;
    // 记分牌
    scorePanel: ScorePanel;
    // 创建一个属性来存储蛇的移动方向（也就是按键的方向）
    direction: string = '';
    // 创建一个属性用来记录游戏是否结束
    isLive = true;
    constructor() {
        this.snake = new Snake();
        this.food = new Food();
        this.scorePanel = new ScorePanel();
        // 游戏的初始化方法，调用后游戏即开始
        this.init()
    }
    init() {
        //绑定按键按下的事件
        document.addEventListener('keydown', this.keydownHandler.bind(this))
        // 调用run方法，使蛇移动
        this.run()
    }

    // ArrowUp 
    // ArrowRight
    // ArrowDown
    // ArrowLeft
    //创建一个键盘按下的响应函数
    keydownHandler(event: KeyboardEvent) {
        // 需要检查event.key的值是否合法（用户是否按了正确的按键）
        // 修改direction属性
        this.direction = event.key


    }
    // 创建一个控制蛇移动的方法
    run() {
        /**
         *     根据方向（this.direction）来使蛇的位置改变
         *          向上    top减少
         *          向下    top增加
         *          向左    left增少
         *          向右    left减加
         */
        // 获取蛇现在的坐标
        let X = this.snake.X
        let Y = this.snake.Y

        // 根据按键的方向修改X,Y值
        switch (this.direction) {
            case 'ArrowUp':
                // 向上移动top减少
                Y -= this.snake.head.offsetWidth
                break
            case 'ArrowDown':
                // 向下移动
                Y += this.snake.head.offsetWidth
                break
            case 'ArrowLeft':
                // 向左移动
                X -= this.snake.head.offsetWidth
                break
            case 'ArrowRight':
                // 向右移动
                X += this.snake.head.offsetWidth
                break
        }
        // 检查蛇是否吃到了食物
        this.checkEat(X, Y)
        // 修改蛇的X和y值
        try {
            this.snake.X = X
            this.snake.Y = Y
        } catch (e: any) {
            //进入catch，说明出现了异常，游戏结束，弹出提示信息
            alert(e.message + "GAME OVER")
            // 将isLive设置为false
            // 判断游戏是否结束
            this.isLive = false
        }

        // 开启一个定时调用
        this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30)
    }


    // 定义一个方法，用来检测蛇是否吃到食物
    checkEat(X: number, Y: number) {

        if (X === this.food.X && Y === this.food.Y) {
            // 食物的位置要进行重置
            this.food.change()
            // 分数增加
            this.scorePanel.addScore()
            // 蛇要增加一节
            this.snake.addBody()
        }
    }


}
export default GameControl